有時我們會需要讓邊界裡面是圓角,但是外面還是維持直角。
最直覺的做法是用二個 <div>
一個做內框一個做外框,外框的背景顏色是邊界的顏色。
<div class="container">
<div>
I'm putting myself to the fullest possible use, which is all I think that any conscious entity can ever hope to do.
</div>
</div>
.container {
background: black;
padding: .8em;
}
.container > div {
background: coral;
border-radius: .8em;
padding: 1em;
}
不過這樣做要用到二個元素,違反了 HTML 的語意原則。那有沒有只用一個元素的方法呢?
有的,但是這個技巧有其限制,下面要介紹的方法只能限制邊界是單一的顏色,如果邊界要有花紋的話只能使用前面展示的方法。
還記得之前的文章提過的「多重邊界」技巧嗎?用box-shadow
和outline
偽裝成border
。在這裡我們重施故技,再加上運用「outline
不受border-radius
影響,但是box-shadow
會」的特性。
圖片示範比較清楚:
這個是圓角元素的 outline
這個是圓角元素的 box-shadow
發現差別了嗎?outline
內外八個角仍然維持直角,不會受元素border-radius
的影響。
當 outline 和 box-shadow 顏色都是一樣的時候,重疊在一起看起來就像一個邊界。
所以我們唯一的挑戰就是要填滿內角的四個空隙,這張圖box-shadow
用檸檬綠替換,大家看得比較清楚。
那麼最少要多大的 spread 值才能填滿這個空隙呢?這個時候就要把小時候的數學拿出來用了!
以範例中border-radius: .8em
,代入公式再進位到小數點以下二位可得到 .34em 的 spread 值,懶得計算的話記得取border-radius
的一半為 spread 值就夠了。
此時細心一點的人應該會發現,今天教的偽裝邊界手法,有一個限制就是outline
值不能比box-shadow
spread 值小,如果邊界很細的話就遮不住box-shadow
的圓角,只能使用第一種方法了。
最後要注意的是,這個方法運用了「outline
不受border-radius
影響」的特性,但不能保證 CSS WG 將來不會變更這個設定。